`timescale 1ns/1ps
`default_nettype none
// 文件名：rtl/dmem.v
// 作用：数据内存（字节数组，**不再**根据 addr[1:0] 左移对齐）
// 约定：CPU 已经把 wdata 的各字节放在正确的 lane，byte_we[i] 选通 mem[base+i]
module dmem #(
  parameter DEPTH_BYTES = 64*1024
)(
  input  wire        clk,
  input  wire        rstn,
  input  wire [31:0] addr,      // 字节地址
  input  wire [31:0] wdata,     // 已按 lane 对齐的数据
  input  wire [3:0]  byte_we,   // 写使能[3:0]，bit0->低地址字节 ... bit3->高地址字节
  output wire [31:0] rdata      // 读出对齐字（小端拼）
);

  // 8-bit 字节存储
  reg [7:0] mem [0:DEPTH_BYTES-1];

  // 字对齐地址
  wire [31:0] base = {addr[31:2], 2'b00};

  // 写：write-first 逐字节
  always @(posedge clk) begin
    if (byte_we[0]) mem[base + 0] <= wdata[ 7: 0];
    if (byte_we[1]) mem[base + 1] <= wdata[15: 8];
    if (byte_we[2]) mem[base + 2] <= wdata[23:16];
    if (byte_we[3]) mem[base + 3] <= wdata[31:24];
  end

  // 读：返回“基址对齐”的32位字（LB/LH/LW 的对齐/扩展由 CPU 再处理）
  assign rdata =
      (base+3 >= DEPTH_BYTES) ? 32'h0
    : { mem[base+3], mem[base+2], mem[base+1], mem[base+0] };

endmodule
`default_nettype wire
